1 using System.Collections;
2 using ProceduralToolkit.Examples.UI;
3 using UnityEngine;
4
5 namespace ProceduralToolkit.Examples
6 {
7 public class BoidControllerConfigurator : ConfiguratorBase
8 {
9 public MeshFilter meshFilter;
10 public RectTransform leftPanel;
11 public BoidController.Config config = new BoidController.Config();
12
13 private BoidController controller;
14 private bool simulate = true;
15
16 private void Awake()
17 {
18 Generate();
19 SetupSkyboxAndPalette();
20 StartCoroutine(Simulate());
21
22 InstantiateControl<SliderControl>(leftPanel).Initialize("Max speed", 0, 30,
23 value: (int) config.maxSpeed,
24 onValueChanged: value => config.maxSpeed = value);
25
26 InstantiateControl<SliderControl>(leftPanel).Initialize("Interaction radius", 0, 30,
27 value: (int) config.interactionRadius,
28 onValueChanged: value => config.interactionRadius = value);
29
30 InstantiateControl<SliderControl>(leftPanel).Initialize("Cohesion coefficient", 0, 30,
31 value: (int) config.cohesionCoefficient,
32 onValueChanged: value => config.cohesionCoefficient = value);
33
34 InstantiateControl<SliderControl>(leftPanel).Initialize("Separation distance", 0, 30,
35 value: (int) config.separationDistance,
36 onValueChanged: value => config.separationDistance = value);
37
38 InstantiateControl<SliderControl>(leftPanel).Initialize("Separation coefficient", 0, 30,
39 value: (int) config.separationCoefficient,
40 onValueChanged: value => config.separationCoefficient = value);
41
42 InstantiateControl<SliderControl>(leftPanel).Initialize("Alignment coefficient", 0, 30,
43 value: (int) config.alignmentCoefficient,
44 onValueChanged: value => config.alignmentCoefficient = value);
45
46 InstantiateControl<ToggleControl>(leftPanel).Initialize("Simulate", simulate, value => simulate = value);
47
48 InstantiateControl<ButtonControl>(leftPanel).Initialize("Generate", Generate);
49 }
50
51 private IEnumerator Simulate()
52 {
53 while (true)
54 {
55 yield return StartCoroutine(controller.CalculateVelocities());
56 }
57 }
58
59 private void Update()
60 {
61 if (simulate)
62 {
63 controller.Update();
64 }
65 UpdateSkybox();
66 }
67
68 private void Generate()
69 {
70 controller = new BoidController();
71
72 GeneratePalette();
73 Color colorA = GetMainColorHSV().ToColor();
74 Color colorB = GetSecondaryColorHSV().ToColor();
75
76 config.template = MeshDraft.Tetrahedron(0.3f);
77 // Assuming that we are dealing with tetrahedron, first vertex should be boid's "nose"
78 config.template.colors.Add(colorA);
79 for (int i = 1; i < config.template.vertexCount; i++)
80 {
81 config.template.colors.Add(colorB);
82 }
83
84 meshFilter.mesh = controller.Generate(config);
85 }
86 }
87 }